package com.itheima.aop;
// 导入包声明，指定该类所在的包

import com.itheima.mapper.EmpLoginLogMapper;
// 导入 EmpLoginLogMapper 接口，用于操作登录日志数据



// 导入 tliaswebmanagement 模块下的所有 pojo 类，包括 Emp, EmpLoginLog, Result, LoginInfo 等

import com.itheima.pojo.Emp;
import com.itheima.pojo.EmpLoginLog;
import com.itheima.pojo.LoginInfo;
import com.itheima.pojo.Result;
import lombok.extern.slf4j.Slf4j;
// 导入 Lombok 的Slf4j 注解，用于简化日志记录

import org.aspectj.lang.ProceedingJoinPoint;
// 导入 AspectJ 的 ProceedingJoinPoint 类，用于在切面中执行连接点的方法

import org.aspectj.lang.annotation.Around;
// 导入 Around 注解，定义环绕通知

import org.aspectj.lang.annotation.Aspect;
// 导入 Aspect 注解，标识该类为一个切面

import org.aspectj.lang.annotation.Pointcut;
// 导入 Pointcut 注解，定义切入点

import org.springframework.beans.factory.annotation.Autowired;
// 导入 Autowired 注解，用于自动装配依赖

import org.springframework.stereotype.Component;
// 导入 Component 注解，标识该类为一个 Spring 组件

import java.time.LocalDateTime;
// 导入 LocalDateTime 类，用于处理日期和时间

import java.util.Arrays;
// 导入 Arrays 类，提供操作数组的静态方法

@Slf4j
// 使用 Slf4j 注解，简化日志记录的使用

@Aspect
// 标识该类为一个切面

@Component
// 标识该类为一个 Spring 组件，使其能够被 Spring 容器管理

public class LoginLogAspect {
    // 定义 LoginLogAspect 类，用于记录登录日志

    @Autowired
    // 自动装配 EmpLoginLogMapper 实例
    private EmpLoginLogMapper empLoginLogMapper;
    // 声明 EmpLoginLogMapper 类型的私有属性 empLoginLogMapper

    @Around("@annotation(com.itheima.annotation.LoginOperation)")
    // 定义一个环绕通知，该通知应用于带有 LoginOperation 注解的方法上
    public Object rexcordLog(ProceedingJoinPoint pjp) throws Throwable {
        // 定义 rexcordLog 方法，参数为 ProceedingJoinPoint 类型的 pjp，返回值类型为 Object

        long begin = System.currentTimeMillis(); // 获取当前时间（毫秒），作为操作开始时间

        Object result = pjp.proceed(); // 执行原始方法，并获取其返回值

        long end = System.currentTimeMillis(); // 再次获取当前时间（毫秒），作为操作结束时间

        EmpLoginLog empLoginLog = new EmpLoginLog(); // 创建一个新的 EmpLoginLog 对象，用于记录登录日志

        // 获取方法参数
        Object[] args = pjp.getArgs(); // 获取原始方法的参数数组

        // 强转成 EMP
        Emp emp = (Emp) args[0]; // 将第一个参数强转为 Emp 类型的对象

        System.out.println(Arrays.toString(args)); // 打印参数数组，用于调试

        // 设置登录日志的用户名
        empLoginLog.setUsername(emp.getUsername());
        // 设置登录日志的密码
        empLoginLog.setPassword(emp.getPassword());
        // 设置登录日志的登录时间为当前时间
        empLoginLog.setLoginTime(LocalDateTime.now());

        // 将原始方法的返回值强转为 Result 类型的对象
        Result result1 = (Result) result;
        // 获取 Result 对象中的 code 属性值（自动拆箱）
        int code = result1.getCode();
        // 将 int 类型的 code 转换为 Short 类型（自动装箱）
        Short code1 = (short) code;

        // 设置登录日志的 isSuccess 属性值
        empLoginLog.setIsSuccess(code1);

        Object data = result1.getData(); // 获取 Result 对象中的 data 属性值
        if (data != null) {// 判断 data 是否为空
            LoginInfo lig = (LoginInfo) data; // 将 data 强转为 LoginInfo 类型的对象
            String token = lig.getToken(); // 获取 LoginInfo 对象中的 token 属性值

            // 设置登录日志的 jwt 属性值
            empLoginLog.setJwt(token);
        }else {
            empLoginLog.setJwt(null);
        }

        // empLoginLog.setJwt(null);


        // 设置登录日志的 costTime 属性值，即操作耗时（毫秒）
        empLoginLog.setCostTime(end - begin);

        empLoginLogMapper.insert(empLoginLog); // 通过 empLoginLogMapper 插入登录日志记录

        return result; // 返回原始方法的返回值
    }
}